package main

import "sync"

// sync.Mutex 和 sync.RWMutex 的 0 值也是合法的，所以我们基本不需要声明一个指针指向 mutex。
func main() {
	// Bad
	//mu := new(sync.Mutex)
	//mu.Lock()
	// Good
	var mu sync.Mutex
	mu.Lock()

}

// 如果 struct 内部使用 mutex，在我们使用 struct 的指针类型时候，mutex 也可以是一个非指针类型的 field，或者直接嵌套在 struct 中。
// Mutex 直接嵌套在 struct 中。
type Smap struct {
	sync.Mutex

	data map[string]string
}

func NewSMap() *Smap {
	return &Smap{data: make(map[string]string)}
}
func (m *Smap) Get(k string) string {
	m.Lock()
	defer m.Unlock()
	return m.data[k]
}
